﻿using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Threading;
using System.Reflection;
using System.IO;
using System.Drawing;
using System.Text;


// usare: espressioni regolari; factory
namespace Prassi2ExpertUpTransfer
{
    
    public partial class Form1 : Form
    {

        string path_FileTrasferPrassi = null;
        Watcher watcherObject = null;
        string baseDir = @"C:\";

        public Form1()
        {
            InitializeComponent();
            btn_invia.Enabled = false;
            btn_startThread.Enabled = true;
            btn_stopThread.Enabled = false;

            Assembly ass = Assembly.GetEntryAssembly();
            baseDir = Path.GetDirectoryName(ass.Location);
        }
        
        // TASTO SELEZIONA FILE TRASFER
        private void btn_seleziona_Click(object sender, EventArgs e)
        {
            bool errore = false;
            btn_invia.Enabled = false;

            // Create OpenFileDialog
            OpenFileDialog dlg = new OpenFileDialog();

            // Set filter for file extension and default file extension
            dlg.InitialDirectory = @baseDir;
            dlg.DefaultExt = ".txt";
            dlg.Filter = "file txt (.txt)|*.txt";
            dlg.Title = "Seleziona il flusso contabile TRASFER da convertire";

            // Get the selected file name and display in a TextBox
            while (dlg.ShowDialog() == DialogResult.OK)
            {

                // lettuta txt in un Array
                string[] righeTrasfer = null;

                try
                {

                    // Open document
                    path_FileTrasferPrassi = dlg.FileName;
                    AggiornaTextbox(lblTrasferSelezionato.Text);
                    AggiornaTextbox(path_FileTrasferPrassi);
                    txtTrasferSelezionato.Text = path_FileTrasferPrassi;

                    // tutte le righe in un array
                    righeTrasfer = System.IO.File.ReadAllLines(path_FileTrasferPrassi);

                }
                catch (Exception ex)
                {
                    AggiornaTextbox("errore lettura archivio txt: " + ex.Message);
                    errore = true;
                    break;
                }


                // carica registrazioni a nella TextBox
                foreach (string rigaTrasfer in righeTrasfer)
                {
                    AggiornaTextbox(rigaTrasfer.ToString());
                }





                // attivo tasto invia
                if (!errore)
                {
                    btn_invia.Enabled = true;
                }
                break;
            }

        }


        public void AggiornaTextbox(Color colore)
        {
            this.Invoke(
              new Action(
                delegate()
                {
                    textBox_CoGe.ForeColor = colore;

                }
            ));
        }

        public void AggiornaTextbox(String testo)
        {
            this.Invoke(
              new Action(
                delegate()
                {
                    textBox_CoGe.AppendText(testo + Environment.NewLine);
                }
            ));
        }

        // TASTO TRASFORMA IN EXPERTUP
        private void btn_invia_Click(object sender, EventArgs e)
        {
            StringBuilder rigaTextBox = new StringBuilder();
            try
            {
                textBox_CoGe.ForeColor = Color.Red;
                // istanzio la classe Trasfer
                TrasferPrassi trasfer = new TrasferPrassi(txtTrasferSelezionato.Text);
                if (trasfer.Elabora())
                {
                    TrasferExpertUp teu = Prassi2ExpertUpTransfer.TrasferExpertUp.ElaboraTrasferPrassi(trasfer);


                    if (teu.ScriviTrasferExpertUp(trasfer.Path_File, trasfer))
                    {
                        AggiornaTextbox("Conversione terminata!");
                        AggiornaTextbox(Color.Black);
                        MessageBox.Show("Conversione terminata!", "Info",
                                   MessageBoxButtons.OK, MessageBoxIcon.Information); 
                    }
                    else
                    {
                        AggiornaTextbox("Errori nella conversione");
                        MessageBox.Show("Errori nella conversione", "Errore",
                                   MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }

                }
                else
                {
                    AggiornaTextbox("Errore nella elaborazione del File");
                    MessageBox.Show("Errore nella elaborazione del File", "Errore",
                               MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception err)
            {
                // TODO Exception in elaborazione da Form1
                //rigaTextBox.Append("Errore nel caricamento del file: " + path_FileTrasferPrassi + ". ");
                
                Type errType = err.GetType();
                if (errType != typeof(System.NullReferenceException))
                {
                    //rigaTextBox.Append(Environment.NewLine + "Errore: " + err.ToString());
                }
                rigaTextBox.Append(Environment.NewLine + "Errore: " + err.ToString());

                AggiornaTextbox(rigaTextBox.ToString());

            }

        }

        // TASTO AVVIO ATTESA TRASFER
        private void btn_start_Click(object sender, EventArgs e)
        {
            // * aggiunto this nel costruttore del Watcher dd++
            watcherObject = new Watcher(this);
            watcherObject.Start();

            // imposto il tasto avvio
            btn_startThread.Enabled = false;
            btn_stopThread.Enabled = true;
        }

        // TASTO ARRESTO THREAD ATTESA TRASFER
        private void btn_stopThread_Click(object sender, EventArgs e)
        {
            // Arresto del Thread.
            watcherObject.Stop();
            AggiornaTextbox(Environment.NewLine);
            AggiornaTextbox("Chiuso il sistema di ascolto dei TRASFER. ");
            AggiornaTextbox(Environment.NewLine);
            btn_startThread.Enabled = true;
            btn_stopThread.Enabled = false;
        }

        // TASTO PULIZIA DEI LOG
        private void btn_clearLog_Click(object sender, EventArgs e)
        {
            textBox_CoGe.Clear();
            AggiornaTextbox(Color.Black);
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
        }

        private void Form1_Load(object sender, EventArgs e)
        {


        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
    }
}
